package com.zjdiepu.www.security.server.encode;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.zjdiepu.www.config.ServerConfig;
import com.zjdiepu.www.security.server.core.Partners;

/**
 * jwt加解密工具 类描述: <br/>
 * 项目名称:diepu-parent-partner <br/>
 * 类名称:ServerJwtUtil <br/>
 * 创建人:xiongxiaotun <br/>
 * 创建时间:2017年8月21日 下午4:13:17 <br/>
 * 修改人:xiongxiaotun <br/>
 * 修改时间: 2017年8月21日 下午4:13:17 <br/>
 * 修改备注: <br/>
 * 
 * @version V1.0 <br/>
 */
public class ServerJwtUtil {
	private static final Logger logger = LoggerFactory
			.getLogger(ServerJwtUtil.class);

	/**
	 * 解密
	 * @author xiongxiaotun <br/>
	 * @Title dencode <br/>
	 * @Description 解密 <br/>
	 * @param content 加密后字符串
	 * @param partner
	 * @return 解密后的json字符串
	 * @version V1.0 <br/>
	 */
	public static String dencode(String content, Partners partner) {
		if(StringUtils.isBlank(content)) {
			return null;
		}
		try {
			Claims claims = Jwts.parser()
					.setSigningKey(ServerConfig.getPartnerJwtSecretKey(partner).getBytes())
					.parseClaimsJws(content).getBody();
			Map<String, Object> result = new HashMap<String, Object>();
			result.putAll(claims);
			return JSON.toJSONString(result);
		} catch (Exception e) {
			logger.error("jwt解密:content:{},partner:{}.异常栈:{}", content, partner.getCode(), e);
		}
		return null;
	}

	/**
	 * 加密
	 * 
	 * @author xiongxiaotun <br/>
	 * @Title encode <br/>
	 * @Description 加密 <br/>
	 * @param content json字符串
	 * @param partner
	 * @return
	 * @version V1.0 <br/>
	 * @throws BasePartnerException
	 */
	public static String encode(String content, Partners partner) {
		if(StringUtils.isBlank(content)) {
			return null;
		}
		try {
			SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
			// 添加构成JWT的参数
			JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT")
					.setPayload(content)
					.signWith(signatureAlgorithm, ServerConfig.getPartnerJwtSecretKey(partner).getBytes());
			// 生成加密数据
			return builder.compact();
		} catch (Exception e) {
			logger.error("jwt加密:map:{},partner:{}.异常栈:{}", content, partner.getCode(), e);
		}
		return null;
	}
}
